var Koa = require('koa');
var views = require('koa-views');
var bodyParser = require('koa-bodyparser');
const serve = require('koa-static');
const render  = require('koa-art-template');
const path = require('path');
var {router} = require('./router');


var app = new Koa()

/*
执行流程：
    1、从上往下执行中间件
    2、遇到 next 执行下一个中间件
    3、中间件执行结束之后，匹配路由
    4、路由匹配结束后，执行中间件 next 后的代码，还是从下往上执行
*/

/*
输入 '/news' 路由，匹配路由成功
输出：
    第一个中间件 next 之前
    第二中间件 next 之前
    这是一个新闻页面
    第二中间件 next 之后
    第一个中间件 next 之后
输入 '/news1' 路由，匹配路由失败
输出：
    第一个中间件 next 之前
    第二中间件 next 之前
    第二中间件 next 之后
    第一个中间件 next 之后
*/

// 应用级中间件
app.use(async(ctx, next) => {
    // 匹配路由之前执行
    // ctx.body = '这是一个中间件'
    console.log('第一个中间件 next 之前');
    // 继续向下匹配
    await next()
    console.log('第一个中间件 next 之后');
})

// 错误中间件 
app.use(async(ctx, next) => {
   console.log('第二中间件 next 之前');
    await next()
    console.log('第二中间件 next 之后');
    if (ctx.status == 404) {
        ctx.status = 404
        ctx.body = '这是一个404页面'
    }
})


// 在中间件中配置 ctx.state.userInfo 在任何页面中都可以使用 userInfo
app.use(async(ctx, next) => {
    ctx.state.userInfo = 'name'
    await next()
})



// 第三方中间件
// ! 配置模板引擎77
// app.use(views('views', { extension: 'ejs' }))
// app.use(views('views', { map: { html: 'ejs' }}))


// ! art-template 
render(app, {
    root: path.join(__dirname, 'views'),  // 视图位置
    extname: '.html',  // 后缀名
    debug: process.env.NODE_ENV !== 'production'   // 开启调试模式
});


// ! post 参数解析中间件
app.use(bodyParser());

// ! 静态资源中间件
app.use(serve('static'))




// todo 启动路由
// router.allowedMethods() 在所有路由中间件之后调用，此时根据 ctx.status 设置 response 响应头
app
    .use(router.routes())
    .use(router.allowedMethods())

app.listen(3001)